package com.ruoyi.system.xcenter.adapter;

import com.ruoyi.common.json.JSON;
import com.ruoyi.common.json.JSONObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ExceptionUtil;
import com.ruoyi.common.utils.security.Md5Utils;
import com.ruoyi.system.domain.DataxBizOrder;
import com.ruoyi.system.mapper.DataxBizOrderMapper;
import com.ruoyi.system.xcenter.EPContext;
import com.ruoyi.system.xcenter.WrapperAdapter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@EnableScheduling
public class Xiwo2XindianAdapter implements WrapperAdapter {

    private EPContext ctx;

    @Autowired
    private DataxBizOrderMapper bizOrderMapper;

    /**
     * 数据转封装器
     * @param data
     * @param ctx
     * @param type 1:停车位同步；2：入场；3：出场
     * @return
     */
    @Override
    public Object wrapperData(Object data, EPContext ctx, Integer type) {
        this.ctx = ctx;
        Object req = new JSONObject();
        try {
            ctx.getXchangeLog().setClientEndReq((String) data);
            switch (type){
                case 1:
                    req = wrapperParkSpaceXindian((String) data);
                    break;
                case 2:
                    req = wrapperParkInXindian((String) data);
                    break;
                case 3:
                    req = wrapperParkOutXindian((String) data);
                    break;
                case 4:
                    break;
                default:
                    log.warn("未知的数据接入类型");
                    break;
            }
        }catch (Exception e){
            log.error("数据适配器异常，{}",e);
            ctx.getXchangeLog().setErrorLog(ExceptionUtil.getExceptionMessage(e));
        }

        return req;
    }


    /**
     * 西沃>信电数据转换--车位信息变化
     * @param body
     * @return
     */
    private Object wrapperParkSpaceXindian(String body) throws Exception {
        JSONObject.JSONArray result = new JSONObject.JSONArray();
        JSONObject json = JSON.unmarshal(body,JSONObject.class);

        JSONObject parkOutJson = new JSONObject();
        //停车场编号
        parkOutJson.put("parkpotId",ctx.getPlatform().getParkNo());
        //剩余车位
        parkOutJson.put("freeParklotCount",json.getInt("remainParkNum"));
        result.add(parkOutJson);

        return result;
    }

    /**
     * 西沃>信电数据转换--车辆离场
     * @param body
     * @return
     */
    private Object wrapperParkOutXindian(String body) throws Exception {
        JSONObject.JSONArray result = new JSONObject.JSONArray();
        JSONObject json = JSON.unmarshal(body,JSONObject.class);
        String parkCode = json.getStr("parkCode");
        JSONObject parkOutJson = new JSONObject();
        //停车场编号
        parkOutJson.put("parkpotId",ctx.getPlatform().getParkNo());
        //停车场入场编号（流水号）
        parkOutJson.put("extBusinessId",json.get("recordNo"));
        //入场时间
        parkOutJson.put("parkTime",json.get("inTime"));
        //出场时间
        parkOutJson.put("leaveTime",json.get("outTime"));
        //车牌号码
        parkOutJson.put("plateNo",json.get("carNo"));
        //车辆类型
        parkOutJson.put("plateType",plateTypeConvert(json.get("carType").toString()));
        //到达方式
        parkOutJson.put("parkBusinessType",11);
        //剩余车位
        parkOutJson.put("freeParklotCount",json.get("remainParkNum"));
        //离开方式
        parkOutJson.put("leaveBusinessType",21);
        String moneyStr = json.getStr("ysMoney")!=null?json.getStr("ysMoney"):"0";
        Float money = Float.valueOf(moneyStr)*100;
        parkOutJson.put("paymentTotal",money.intValue());
//        parkOutJson.put("outImgUrl",ossUrlConvert(body,json.getStr("outCarPhoto")));
//        parkOutJson.put("outImgTaketime",json.getStr("outTime"));
//        parkOutJson.put("plateColor",JSON.unmarshal(json.getStr("vehicleInfo"),JSONObject.class).getStr("plateColor"));

        result.add(parkOutJson);
        return result;
    }

    /**
     * 西沃>信电数据转换--车辆进场
     * @param body
     * @return
     */
    private Object wrapperParkInXindian(String body) throws Exception {
        JSONObject.JSONArray result = new JSONObject.JSONArray();
        JSONObject json = JSON.unmarshal(body,JSONObject.class);

//        String parkCode = json.getStr("parkCode");
        JSONObject parkOutJson = new JSONObject();
        //停车场ID（向平台申请）
        parkOutJson.put("parkpotId",ctx.getPlatform().getParkNo());
        //停车场停车场业务id
        parkOutJson.put("extBusinessId",json.get("recordNo"));
        //入场时间
        parkOutJson.put("parkTime",json.get("inTime"));
        //车牌号码
        parkOutJson.put("plateNo",json.get("carNo"));
//        车牌颜色 0	其它  1	白   2	灰  3	黑 4	红    5	黄 6	绿  7	蓝
//        parkOutJson.put("plateColor","0");
//        车牌种类 01	大型汽车 02	小型汽车 51	大型新能源车 52	小型新能源车
        parkOutJson.put("plateType",plateTypeConvert(json.get("carType").toString()));
//         到达业务类型 11	普通到达 12	包月到达 13	企业包月到达 14	产权车到达 15	特殊车辆到达 16	挂单车到达 18	共享到达
        parkOutJson.put("parkBusinessType",11);
        //停车场空车位数
        parkOutJson.put("freeParklotCount",json.get("remainParkNum"));
        //入场图片
//      parkOutJson.put("inImgUrl","");
        //入场图片时间
        parkOutJson.put("inImgTaketime",json.get("inTime"));
        result.add(parkOutJson);
        return result;
    }

    private void saveOrderParkIn(JSONObject dataItem){
        DataxBizOrder bizOrder = new DataxBizOrder();
        String inTime = dataItem.getStr("inTime");
        bizOrder.setParkNo(dataItem.getStr("parkCode"));
        bizOrder.setInTime(DateUtils.dateTime("yyyy-MM-dd HH:mm:ss",inTime));
        bizOrder.setPlateNo(dataItem.getStr("carNumber"));
        String id = Md5Utils.hash(bizOrder.getParkNo()+bizOrder.getPlateNo()+inTime);
        bizOrder.setId(id);

        DataxBizOrder bizOrderBase = bizOrderMapper.selectDataxBizOrderById(id);
        if(bizOrderBase==null){
            bizOrderMapper.insertDataxBizOrder(bizOrder);
        }
    }

/*
    车牌转换 西沃 A:小型车 B:中型车 C:大型车  D:摩托车
    车牌种类 信电 01	大型汽车 02	小型汽车 51	大型新能源车 52	小型新能源车
*/
    private String plateTypeConvert(String plateColor){
        switch (plateColor){
            case "A":
            case "D":
                return "02";
            default:
                return "01";
        }
    }

}
